package com.mlh.stack;

/**
 * @author 缪林辉
 * @date 2024/3/23 17:19
 * @DESCRIPTION
 */

// 根据逆波兰表示法（后缀表达式），求表达式的值。
// 有效的运算符包括 + ,  - ,  * ,  / 。每个运算对象可以是整数，也可以是另一个逆波兰表达式。
// 说明：
// 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说，表达式总会得出有效数值且不存在除数为 0 的情况。
// 示例 1：
// 输入: ["2", "1", "+", "3", " * "]
// 输出: 9
// 解释: 该算式转化为常见的中缀算术表达式为：((2 + 1) * 3) = 9
public class EvalRPN {
    public static int method1(String[] tokens) {
        // 从左向右扫描 遇到数字进栈，遇到符号则弹出另两个数字做运算，然后再压入栈
        // 用数组模拟栈
        //这题思路不难，主要是处理类型比较麻烦
        //字符型 数学符号和数字要区分开  这个没什么好的办法 首先是看长度 长度大于2肯定是数字
        //其次 就是单字符看看有没有在0-9之间
        //其次字符型数字要转成int类型  运用Integer.parseInt()方法
        int[] stack = new int[tokens.length];
        int index = 0;
        for (int i = 0; i < tokens.length; i++) {
            if (tokens[i].length()>1||tokens[i].charAt(0)>='0'&&tokens[i].charAt(0)<='9') {
                stack[index++] = Integer.parseInt(tokens[i]);
            } else {
                switch (tokens[i].charAt(0)) {
                    case'+':
                        stack[index - 2] = stack[index - 2] + stack[index - 1];
                        index = index - 1;
                        break;
                    case'-':
                        stack[index - 2] = stack[index - 2] - stack[index - 1];
                        index = index - 1;
                        break;
                    case'/':
                        stack[index - 2] = stack[index - 2] / stack[index - 1];
                        index = index - 1;
                        break;
                    case'*':
                        stack[index - 2] = stack[index - 2] * stack[index - 1];
                        index = index - 1;
                        break;
                }
            }
        }
        return stack[0];
    }
}
